package com.star.uc.factory.login;


import com.star.common.core.operator.Operator;
import com.star.uc.contract.dto.request.LoginRequest;
import com.star.uc.contract.query.RenderAuthQuery;
import com.star.uc.infras.repository.model.UserInfoBO;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthRequest;

/**
 * 登录类型策略
 *
 * @author zhouhengzhe
 * @version 1.0
 * @date 2023/10/19 17:23
 */
public interface LoginTypeOperator extends Operator<String> {

    /**
     * 检查对应的登录类型的参数
     *
     * @param loginRequest 登录请求
     */
    void checkParam(LoginRequest loginRequest);

    /**
     * 登录
     *
     * @param loginRequest 登录请求
     * @return 用户信息
     */
    UserInfoBO authorize(LoginRequest loginRequest);

    /**
     * 创建用户
     *
     * @param loginRequest 登录请求信息
     * @param authUser     第三方响应信息
     * @return 用户信息
     */
    UserInfoBO createUser(LoginRequest loginRequest, AuthUser authUser);

    /**
     * 创建用户映射
     *
     * @param uid          用户ID
     * @param loginRequest 登录请求信息
     * @param authUser     第三方响应信息
     */
    void createUserMapping(String uid, LoginRequest loginRequest, AuthUser authUser);

    /**
     * 获取授权地址
     *
     * @param renderAuthQuery 授权参数
     * @return 授权地址
     */
    String getAuthorizeUrl(RenderAuthQuery renderAuthQuery);

    /**
     * 获取授权请求参数
     *
     * @param tenantId   租户ID
     * @param clientType 客户端类型
     * @param thirdType  第三方类型
     * @return 授权请求参数
     */
    AuthRequest getAuthRequest(String tenantId, String clientType, String thirdType);

    /**
     * 获取授权回调信息
     *
     * @param loginRequest 登录请求信息
     * @return 授权回调信息
     */
    AuthCallback getAuthCallback(LoginRequest loginRequest);
}
